const express = require("express");
const router = express.Router();
const userDB = require("../../database/userinfo");  //用户表操作
const messageDB = require("../../database/message");   //留言表操作

// 鉴权 首先判断用户名是否登录
router.use((req, res, next) => {
  if (!req.session.userInfo) {
    return res.send({
      code: 7,
      message: "用户未登录"
    });
  }
  next();
});

// 发表留言路由
router.post("/publish",async (req,res)=>{
  let {valMsg} = req.body;
  valMsg = valMsg.trim();
  // 验证数据格式是否正确
  // if(!valMsg || valMsg.length >100){
  //   return res.send({
  //     code:1,
  //     message:"你发表的评论内容格式不正确！"
  //   });
  // }

  // 将评论存到数据库
  await messageDB.create({
    content:valMsg,  //留言内容
    author:req.session.userInfo._id  //发表这条评论的作者id
  });
  res.send({
    code:0,
    message:"评论发表成功"
  })
});

// 给父级点赞的路由
router.post("/liks/comment",async (req,res)=>{
  let {id} = req.body;  //评论id
   // 判断id是否存在
  if(!id){
    return res.send({
      code:1,
      message:"评论id没收到！"
    });
  }
    // 留言表id
    let commentDoc =  await messageDB.findById(id);
    if(!commentDoc){
      return res.send({
        code:2,
        message:"你发来的评论id不存在",
      })
    };

    let userId = req.session.userInfo._id; // 当前发起请求的用户id
    // 判断用户是否点过赞 / 判断当前点击按钮的用户是否存在liks数组中
    if(commentDoc.liks.includes(userId)){
      // 存在，点过赞 ，  要取消赞
      await messageDB.findByIdAndUpdate(id,{$pull:{liks:userId}}); //在数组中删除
    }else{
      // 没点过赞， 要点赞
      await messageDB.findByIdAndUpdate(id,{$push:{liks:userId}});
    }
    res.send({
      code:0,
      message:"点赞/取消的操作已经完成"
    });

});

// 在父级评论下， 提交回复内容
router.post("/reply/submit",async (req,res)=>{
  // id是父级评论的id ，  content是评论内容 ，  replyUser是给父级评论的作者id
  let {id,content,replyUser} = req.body;
  // 判断数据格式，数据是否为空，/ 数据长度是否超过100
  // if(!content){
  //   return res.send({
  //     code:1,
  //     message:"回复的内容不能为空",
  //   })
  // };
  // if(content.length>100){
  //   return res.send({
  //     code:2,
  //     message:"回复的内容不能超过100"
  //   })
  // }
  // 判断当前这条父级评论是否存在  父级评论的作者是否存在
  let doc1 = await messageDB.findById(id);
  if(!doc1){
    return res.send({
      code:3,
      message:"您要回复的用户id错误，用户不存在"
    })
  };
  // 父级评论的作者是否存在
  let doc2 = await userDB.findById(replyUser);
  if(!doc2) return res.send({code:3,message:"你要回复的用户的id错误,用户不存在"})

  await messageDB.findByIdAndUpdate(id,{
    // 往这条评论下的children数组中添加回复数据
    $push:{
      children:{
        content,
        author:req.session.userInfo._id,  // 写回复的用户id，
        replyUser  // 被回复的那个人的id
      }
    }
  });
  res.send({
    code:0,
    message:"回复成功"
  })

})

// 子级回复的点赞功能
router.post("/likes/replay",async (req,res)=>{
  let {parentId,childId,childIndex} = req.body;
  let parentDoc = await messageDB.findById(parentId); // 父级文档数据
  let childDoc = await parentDoc.children.id(childId);  // 得到当前这条点赞了的子级回复数据
  // console.log(childDoc);

    // 判断父级评论是否为空，/ 数据长度是否超过100
  // if(!parentDoc){
  //   return res.send({
  //     code:1,
  //     message:"您需要回复的用户不存在",
  //   })
  // };
  // 子级评论的id是否存在
  // if(!childDoc){
  //   return res.send({
  //     code:5,
  //     message:"您的id不存在"
  //   })
  // }
  // if(content>100){
  //   return res.send({
  //     code:2,
  //     message:"回复的内容不能超过100"
  //   })
  // }
 

  // 修改子评论的likes的id号
  let userId = req.session.userInfo._id; // 当前发起请求的用户id
  // 判断用户是否点过赞 / 判断当前点击按钮的用户是否存在liks数组中
  if(childDoc.liks.includes(userId)){
    // 存在，点过赞 ，  要取消赞
    await messageDB.findByIdAndUpdate(parentId,{$pull:{[`children.${childIndex}.liks`]:userId}}); //在数组中删除
  }else{
    // 没点过赞， 要点赞
    await messageDB.findByIdAndUpdate(parentId,{$push:{[`children.${childIndex}.liks`]:userId}});
  }
  res.send({
    code:0,
    message:"点赞/取消的操作已经完成"
  });
});

// 导出路由
module.exports = router;